
package com.jf.cloud.im.service;

import com.jf.cloud.api.auth.bo.UserInfoInTokenBO;
import com.jf.cloud.api.multishop.bo.EsShopDetailBO;
import com.jf.cloud.api.multishop.vo.ShopUserVO;
import com.jf.cloud.api.platform.vo.SysUserVO;
import com.jf.cloud.api.user.vo.UserApiVO;
import com.jf.cloud.common.database.dto.PageDTO;
import com.jf.cloud.common.database.vo.PageVO;
import com.jf.cloud.im.model.ImMsgBizUserHistory;
import com.jf.cloud.im.vo.MessageInfoVO;
import com.jf.cloud.im.vo.MsgItemVO;

import java.util.List;

/**
 * 店铺和用户历史聊天记录表
 *
 * @author zz
 * @date 2021-08-25 13:58:56
 */
public interface ImMsgBizUserHistoryService {

    /**
     * 分页获取店铺和用户历史聊天记录表列表
     *
     * @param pageDTO 分页参数
     * @return 店铺和用户历史聊天记录表列表分页数据
     */
    PageVO<ImMsgBizUserHistory> page(PageDTO pageDTO);

    /**
     * 分页获取店铺和用户历史聊天记录表列表
     *
     * @param pageDTO 分页参数
     * @param sendType 发送类型
     * @param bizId 商家或平台id
     * @param employeeId 员工id
     * @param userId 用户id
     * @return 店铺和用户历史聊天记录表列表分页数据
     */
    PageVO<ImMsgBizUserHistory> pageBySendTypeBizIdUserId(PageDTO pageDTO, Integer sendType, Long bizId, Long employeeId, Long userId);

    /**
     * 根据店铺和用户历史聊天记录表id获取店铺和用户历史聊天记录表
     *
     * @param id 店铺和用户历史聊天记录表id
     * @return 店铺和用户历史聊天记录表
     */
    ImMsgBizUserHistory getById(Long id);

    /**
     * 根据店铺和用户历史聊天记录表参数获取店铺和用户历史聊天记录表
     *
     * @param imMsgBizUserHistory 店铺和用户历史聊天记录参数
     * @return 店铺和用户历史聊天记录表
     */
    ImMsgBizUserHistory getByParam(ImMsgBizUserHistory imMsgBizUserHistory);

    /**
     * 保存店铺和用户历史聊天记录表
     *
     * @param imMsgBizUserHistory 店铺和用户历史聊天记录表
     */
    void save(ImMsgBizUserHistory imMsgBizUserHistory);

    /**
     * 更新店铺和用户历史聊天记录表
     *
     * @param imMsgBizUserHistory 店铺和用户历史聊天记录表
     */
    void update(ImMsgBizUserHistory imMsgBizUserHistory);

    /**
     * 批量更新店铺和用户历史聊天记录表
     *
     * @param imMsgBizUserHistories 店铺和用户历史聊天记录表
     */
    void updateBatch(List<ImMsgBizUserHistory> imMsgBizUserHistories);

    /**
     * 根据店铺和用户历史聊天记录表id删除店铺和用户历史聊天记录表
     *
     * @param id 店铺和用户历史聊天记录表id
     */
    void deleteById(Long id);

    /**
     * 查出用户未读消息数
     * @param imMsgBizUserId 消息id
     * @param userUnread 用户未读
     * @param whoSend 谁发的
     * @return 未读消息数
     */
    int countByUserUnread(Long imMsgBizUserId, Integer userUnread, Integer whoSend);

    /**
     * 查出员工未读消息数
     * @param imMsgBizUserId 消息id
     * @param employeeUnread 员工未读
     * @param whoSend 谁发的
     * @return 未读消息数
     */
    int countByEmployeeUnread(Long imMsgBizUserId, Integer employeeUnread, Integer whoSend);

    /**
     * 查出员工未读消息数
     * @param imMsgBizUserId 消息id
     * @param employeeId 员工id
     * @param employeeUnread 员工未读
     * @param whoSend 谁发的
     * @return 未读消息数
     */
    int countByEmployeeUnread2(Long imMsgBizUserId, Long employeeId, Integer employeeUnread, Integer whoSend);

    /**
     * 保存聊天记录
     *
     * @param sendType   聊天类型
     * @param bizId      平台或店铺id
     * @param userId     用户id
     * @param employeeId 员工id
     * @param type       消息类型
     * @param content    消息呢容
     * @param whoSend    发送人
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveHistory(Integer sendType, Long bizId, Long userId, Long employeeId, Integer type, String content, Integer whoSend);

    /**
     * 转换消息实体类
     *
     * @param user                用户信息
     * @param imMsgBizUserHistory 消息历史记录
     * @return 消息转换输出类
     */
    MsgItemVO getUserPlatformMsgItem(UserApiVO user, ImMsgBizUserHistory imMsgBizUserHistory);

    /**
     * 转换消息实体类
     *
     * @param shopDetail     商家信息
     * @param user     用户信息
     * @param imMsgBizUserHistory 消息历史记录
     * @return 消息转换输出类
     */
    MsgItemVO getUserShopMsgItem(EsShopDetailBO shopDetail, UserApiVO user, ImMsgBizUserHistory imMsgBizUserHistory);

    /**
     * 获取用户与平台的聊天记录
     *
     * @param sysUser         平台信息
     * @param messageInfo   信息载体
     * @param bizId           平台或店铺id
     * @param userId          用户id
     * @param user 用户信息
     * @return 翻页聊天记录
     */
    PageVO<MsgItemVO> getUserPlatformHistory(SysUserVO sysUser, MessageInfoVO messageInfo, Long bizId, Long userId, UserApiVO user);

    /**
     * 获取用户与商家的聊天记录
     *
     * @param shopDetail      商家信息
     * @param messageInfo   信息载体
     * @param bizId           平台或店铺id
     * @param userId          用户id
     * @param user 用户信息
     * @return 翻页聊天记录
     */
    PageVO<MsgItemVO> getUserShopHistory(EsShopDetailBO shopDetail, MessageInfoVO messageInfo, Long bizId, Long userId, UserApiVO user);

    /**
     * 获取商家与用户的聊天记录
     *
     * @param userInfoInToken      商家信息
     * @param messageInfo 信息载体
     * @param user          用户信息
     * @param shopDetail          商家信息
     * @return 翻页聊天记录
     */
    PageVO<MsgItemVO> getShopUserHistory(UserInfoInTokenBO userInfoInToken, MessageInfoVO messageInfo, UserApiVO user, EsShopDetailBO shopDetail);

    /**
     * 获取平台与用户的聊天记录
     *
     * @param userInfoInToken       平台信息
     * @param sysUser       平台信息
     * @param messageInfo 信息载体
     * @param user          用户信息
     * @return 翻页聊天记录
     */
    PageVO<MsgItemVO> getPlatformUserHistory(UserInfoInTokenBO userInfoInToken, MessageInfoVO messageInfo, UserApiVO user, SysUserVO sysUser);

    /**
     * 用户标记已读
     *
     * @param messageInfo 信息载体
     * @param bizId         平台或店铺id
     * @param userId        用户id
     * @return 消息历史记录实体类列表
     */
    List<ImMsgBizUserHistory> markUserPlatformRead(MessageInfoVO messageInfo, Long bizId, Long userId);

    /**
     * 用户标记已读
     *
     * @param messageInfo 信息载体
     * @param bizId         平台或店铺id
     * @param userId        用户id
     * @return 消息历史记录实体类列表
     */
    List<ImMsgBizUserHistory> markUserShopRead(MessageInfoVO messageInfo, Long bizId, Long userId);

    /**
     * 商家标记已读
     *
     * @param messageInfo 信息载体
     * @param userInfoInToken      商家信息
     * @param userId        用户id
     * @return 消息历史记录实体类列表
     */
    List<ImMsgBizUserHistory> markShopUserRead(MessageInfoVO messageInfo, UserInfoInTokenBO userInfoInToken, Long userId);

    /**
     * 平台标记已读
     *
     * @param messageInfo 信息载体
     * @param userInfoInToken       平台信息
     * @param userId        用户id
     * @return 消息历史记录实体类列表
     */
    List<ImMsgBizUserHistory> markPlatformUserRead(MessageInfoVO messageInfo, UserInfoInTokenBO userInfoInToken, Long userId);

    /**
     * 保存用户与平台的聊天记录
     *
     * @param messageInfo 信息载体
     * @param bizId         平台或店铺id
     * @param userId        用户id
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveUserPlatformHistory(MessageInfoVO messageInfo, Long bizId, Long userId, Long employeeId);

    /**
     * 保存用户与商家的聊天记录
     *
     * @param messageInfo 信息载体
     * @param bizId         平台或店铺id
     * @param userId        用户id
     * @param employeeId    员工id
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveUserShopHistory(MessageInfoVO messageInfo, Long bizId, Long userId, Long employeeId);

    /**
     * 保存商家与用户的聊天记录
     *
     * @param messageInfo 信息载体
     * @param userInfoInToken      商家信息
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveShopUserHistory(MessageInfoVO messageInfo, UserInfoInTokenBO userInfoInToken);

    /**
     * 保存平台与用户的聊天记录
     *
     * @param messageInfo 信息载体
     * @param userInfoInToken       平台信息
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory savePlatformUserHistory(MessageInfoVO messageInfo, UserInfoInTokenBO userInfoInToken);

    /**
     * 商家切换客服系统提醒
     *
     * @param userInfoInToken        商家信息
     * @param shopUserVO 商家信息
     * @param user 用户信息
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveShopChangeEmployeeReply(UserInfoInTokenBO userInfoInToken, ShopUserVO shopUserVO, UserApiVO user);

    /**
     * 平台切换客服系统提醒
     *
     * @param sysUser3        平台信息
     * @param user 用户信息
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory savePlatformChangeEmployeeReply(UserInfoInTokenBO userInfoInToken, SysUserVO sysUser3, UserApiVO user);
}
